package com.cancer.common.web;

import java.lang.reflect.Constructor;
import com.cancer.common.util.ExceptionUtil;

public class ObjectsUtil {
	/**
	 * 获取值, 若没有则获取默认值
	 * 
	 * @param value
	 * @param def
	 * @return
	 * @author liujun May 6, 2017
	 */
	public static <T> T getElseDefault(T value, T def) {
		return value == null ? def : value;
	}
	
	/**
	 * 转换基础数据类型<br>
	 * NOTE: 经测试该转换方法比原生的Integer.parseInt()、Double.parseDouble()等方法慢约至少30%<br>
	 *
	 * @autohr 刘俊
	 * @date 2016年1月5日
	 * @param type
	 *            目标类型
	 * @param src
	 *            要转换的值
	 * @return 成功返回正确数值，失败返回null
	 */
	@SuppressWarnings("unchecked")
	public static <T> T parseBaseType(Class<T> type, Object src) {
		try {
			Constructor<?> con = type.getDeclaredConstructor(String.class);
			return (T) con.newInstance(src.toString());
		} catch (Exception e) {
			throw ExceptionUtil.wrapRuntime(e);
		}
	}

	/**
	 * 转换基础数据类型<br>
	 * NOTE: 经测试该转换方法比原生的Integer.parseInt()、Double.parseDouble()等方法慢约至少30%<br>
	 *
	 * @autohr 刘俊
	 * @date 2016年1月5日
	 * @param type
	 *            目标类型
	 * @param src
	 *            要转换的值
	 * @param defaultValue
	 *            默认值
	 * @return 成功返回正确数值，失败返回默认数值
	 */
	public static <T> T parseBaseType(Class<T> type, Object src, T defaultValue) {
		try {
			return parseBaseType(type, src);
		} catch (NumberFormatException e) {
			return defaultValue;
		}
	}

	/**
	 * 将对象转换为Integer。先调用toString，再对字符串进行转换
	 *
	 * @author 刘俊 2016年3月18日
	 * @param src
	 * @return 转换出现异常则返回null
	 */
	public static int parseInt(Object src) {
		try {
			return Integer.parseInt(src.toString());
		} catch (Exception e) {
			throw ExceptionUtil.wrapRuntime(e);
		}
	}

	/**
	 * 将对象转换为Integer。先调用toString，再对字符串进行转换
	 *
	 * @author 刘俊 2016年3月18日
	 * @param src
	 * @return 成功返回正确数值，失败返回defaultValue
	 */
	public static int parseInt(Object src, int defaultValue) {
		try {
			return Integer.parseInt(src.toString());
		} catch (Exception e) {
			return defaultValue;
		}
	}

	/**
	 * 将对象转换为Long。先调用toString，再对字符串进行转换
	 *
	 * @author 刘俊 2016年3月18日
	 * @param src
	 * @return 成功返回正确数值，失败返回null
	 */
	public static long parseLong(Object src) {
		try {
			return Long.parseLong(src.toString());
		} catch (Exception e) {
			throw ExceptionUtil.wrapRuntime(e);
		}
	}

	/**
	 * 将对象转换为Long。先调用toString，再对字符串进行转换
	 *
	 * @author 刘俊 2016年3月18日
	 * @param src
	 * @param defaultValue
	 * @return 成功返回正确数值，失败返回defaultValue
	 */
	public static long parseLong(Object src, long defaultValue) {
		try {
			return Long.parseLong(src.toString());
		} catch (Exception e) {
			return defaultValue;
		}
	}

}
